#include <iostream>
#include <cstring>
using namespace std;

/*
	什么时候调用拷贝构造？
	   一句话：右边的对象初始化赋值给左边的新对象
*/

class Cat
{
public:
	//定义猫类的构造函数
	Cat()
	{
		cout<<"猫的构造函数，当前对象是: "<<this<<endl;
	}
	//自己写个拷贝构造
	Cat(const Cat &other)
	{
		cout<<"猫的拷贝构造函数被调用了"<<endl;
	}
private:
	
};

Cat fun()
{
	cout<<"fun函数返回猫的对象"<<endl;
	Cat temp;
	return temp;
}

void otherfun(Cat obj1) //Cat obj1=c1;
{
	cout<<"otherfun函数被调用"<<endl;
}

int main(int argc,char **argv)
{
	Cat c1; //调用构造函数
	
	//函数返回值：返回类对象，此时调用拷贝构造函数
	//g++编译默认会优化掉返回值返回类对象，调用拷贝构造函数
	//g++  xxx.cpp     -fno-elide-constructors 这个选项告知编译器不要搞鬼
	//Cat ret=fun();
	
	//函数参数如果是类对象，你传递实参也是调用拷贝构造函数
	otherfun(c1);
	
	return 0;	
}